﻿/* 在李秋实版本基础上，由肖凯进行修改，半成品状态 */
/* 目前缺文件头的结构体 */
/* 目前的输出函数仅在控制台显示，后续使用是需要返回固定数值 */

#pragma once  // 防止头文件重复包含
#include <iostream> // 包含输入输出流库，用于进行标准输入输出操作
#include <fstream>  // 包含文件流库，用于进行文件的读写操作
#include <vector>   // 包含向量容器库，用于存储动态数组
#include <string>   // 包含字符串库，用于处理字符串
#include <sstream>// 包含字符串流库，用于字符串的解析操作
#include <iomanip>  // 添加此头文件用于设置输出格式

using namespace std;    // 使用标准命名空间
    
struct obssation
{
    double x=0;
    double y=0;
    double z=0;
};
struct obsSat  // 结构体用于存储1颗卫星的观测值
{
    string satID;     // 卫星标识符
    vector<double> values;  // 存储观测值的向量
    double val[32*4];
    double x=0;//卫星位置
    double y=0;
    double z=0;
    double clockBias;//钟差
};
struct obsEpoch        // 结构体用于存储1个历元的所有卫星观测数据
{
    string time;       // 历元时间
    int numSat;
    vector<obsSat> listObsSat; // 存储该历元内所有观测值的向量
};

// Rinex O 文件读取类
class ReadO 
{
public:
    ReadO();// 构造函数
    ReadO(string filePath);     /* 带文件输入的构造函数 */
public:
    bool set_file(string filePath);      // 设置O文件的路径和文件名
    bool parse_file();                   // 读取 Rinex O 文件的函数，返回是否成功读取
    vector<obsEpoch>* get_obs();         // 输出obs数据
    void print_head();                   // 显示文件头部信息的函数
    void print_body(int numtoshow);      // 显示指定数量历元观测数据的函数
    vector<obsEpoch> ListObs2;
    obssation obsxyz1;
/* 私有函数和成员 */
private:
    string    filePath;                         // 文件路径
    vector<string> head;                        // 存储文件头部信息的向量
    vector<obsEpoch> ListObs;                   // 存储所有历元观测数据的向量
};